﻿using System;
using System.Collections.Generic;
using System.Linq;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Datos.Accesos;


namespace Vallejos.Negocio
{
    public class AnalisisCrediticioBLL : IAnalisisCrediticio
    {
        private readonly AnalisisCrediticioDAL _analisis;
        private readonly CreditScoringBLL _creditScoring;
        private readonly EnvioCorreosBLL _envioCorreos;
        private readonly ProductoBLL _producto;
        private readonly HelperCache _cache;
        private readonly SeguridadBLL _seguridad;
        private readonly ComunBLL _comun;
        private readonly SolicitudBLL _solicitud;
        public string UrlPath { get; set; }

        public AnalisisCrediticioBLL()
        {
            _analisis = new AnalisisCrediticioDAL();
            _creditScoring = new CreditScoringBLL();
            _envioCorreos = new EnvioCorreosBLL();
            _producto = new ProductoBLL();
            _cache = new HelperCache();
            _seguridad = new SeguridadBLL();
            _solicitud = new SolicitudBLL();
        }

        public SolicitudDeAnalisisCrediticio GenerarSolicitudDeAnalisis(SolicitudDeAnalisisCrediticio solicitud, int idLenguaje)
        {
            solicitud = _analisis.GenerarSolicitudDeAnalisis(solicitud);

            solicitud = _creditScoring.AnalizarSolicitud(solicitud);

            _analisis.CambiarEstadoDeSolicitud(solicitud);

            

            _envioCorreos.NotificarCambioDeEstadoDeSolicitud(solicitud);

            if (solicitud.Estado.idEstado == IdEstadoAnalisis.PreAprobada)
            {
                var analistas = _seguridad.BuscarPersonas(new EmpleadoBancario
                                                              {
                                                                  Ambito = new Ambito {IdAmbito = IdAmbito.Banco},
                                                                  DatosPersonales = new InformacionPersonal(),
                                                                  Usuario = new Usuario()
                                                              }, idLenguaje);

                solicitud.Analista = (EmpleadoBancario)analistas[new Random().Next(0, analistas.Count - 1)];

                _analisis.AsignarAnalistaDeSolicitud(solicitud);

                _envioCorreos.NotificarAsignacionDeAnalista(solicitud, UrlPath);
            }

            return solicitud;
        }

        public SolicitudDeAnalisisCrediticio LeerSolicitudDeAnalisisEnCurso(int idCliente, int idLenguaje)
        {
            var solicitud = _analisis.LeerSolicitudDeAnalisisEnCurso(idCliente);
            _solicitud.CargarSolicitudConValores(solicitud, idLenguaje);

            return solicitud;
        }

        public void IniciarAnalisisCrediticio(SolicitudDeAnalisisCrediticio solicitud)
        {
            solicitud.Estado.idEstado = IdEstadoAnalisis.AnalisisManual;
            _analisis.CambiarEstadoDeSolicitud(solicitud);
        }

        public void RechazarSolicitudDeAnalisisCrediticio(SolicitudDeAnalisisCrediticio solicitud)
        {
            solicitud.Estado.idEstado = IdEstadoAnalisis.Rechazada;
            _analisis.CambiarEstadoDeSolicitud(solicitud);
            _envioCorreos.NotificarCambioDeEstadoDeSolicitud(solicitud);
        }

        public void AceptarSolicitudDeAnalisisCrediticio(SolicitudDeAnalisisCrediticio solicitud)
        {
            solicitud.Estado.idEstado = IdEstadoAnalisis.Aprobada;
            _analisis.CambiarEstadoDeSolicitud(solicitud);
            _envioCorreos.NotificarCambioDeEstadoDeSolicitud(solicitud);
        }

        public SolicitudDeAnalisisCrediticio LeerSolicitudDeAnalisisEnCurso(int idCliente)
        {
            throw new NotImplementedException();
        }

        public SolicitudDeAnalisisCrediticio LeerUltimaSolicitudDeAnalisisDenegada(int idCliente)
        {
            throw new NotImplementedException();
        }

        public SolicitudDeAnalisisCrediticio LeerUltimaSolicitudDeAnalisisDenegada(int idCliente, int idLenguaje)
        {
            var solicitud = _analisis.LeerUltimaSolicitudDeAnalisisDenegada(idCliente);
            _solicitud.CargarSolicitudConValores(solicitud, idLenguaje);

            return solicitud;
        }

        

        

        public List<Rubro> LeerRubros(int idLenguaje)
        {
            return _cache.ObtenerLista<Rubro>() ?? _cache.SetearLista(_analisis.LeerRubros(idLenguaje));
        }

        public List<MotivoRezhazo> LeerMotivosDeRezhazo(int idLenguaje)
        {
            return _cache.ObtenerLista<MotivoRezhazo>() ?? _cache.SetearLista(_analisis.LeerMotivosDeRezhazo(idLenguaje));
        }

        
        #region IAnalisisCrediticio Members

        public SolicitudDeAnalisisCrediticio GenerarSolicitudDeAnalisis(SolicitudDeAnalisisCrediticio solicitud)
        {
            throw new NotImplementedException();
        }

        #endregion

        
        public List<SolicitudDeAnalisisCrediticio> LeerSolicitudDeAnalisisCrediticioPendientes(int idEmpleado, int idLenguaje)
        {
            var solicitudes = _analisis.LeerSolicitudDeAnalisisCrediticioPendientes(idEmpleado);

            var solicitudesProcesadas = solicitudes.Select(solicitud => (SolicitudDeAnalisisCrediticio) _solicitud.LeerSolicitud(solicitud.Id, idLenguaje)).ToList();

            return solicitudesProcesadas;
        }


        public List<SolicitudDeAnalisisCrediticio> LeerSolicitudDeAnalisisCrediticioPendientes(int idEmpleado)
        {
            throw new NotImplementedException();
        }

        public SolicitudDeAnalisisCrediticio LeerSolicitudDeAnalisisAprobadaDeCliente(string CUIL)
        {
            throw new NotImplementedException();
        }

        public SolicitudDeAnalisisCrediticio LeerSolicitudDeAnalisisAprobadaDeCliente(string CUIL, int idLenguaje)
        {
            var solicitud = _analisis.LeerSolicitudDeAnalisisAprobadaDeCliente(CUIL);

            _solicitud.CargarSolicitudConValores(solicitud, idLenguaje);

            return solicitud;
        }

        public List<EmpresaDeServicio> LeerEmpresasDeServicios()
        {
            return _cache.ObtenerLista<EmpresaDeServicio>() ?? _cache.SetearLista(_analisis.LeerEmpresasDeServicios());
        }
    }
}
